Temperature sensitivity of CO2 emissions in layered cranberry soils

Wilfried Dossou-Yovo, Serge Étienne Parent,Noura Ziadi, Bertrand Normand, and Léon Étienne parent

print(Sys.Date())

1. Objective

This notebook generate the result of CO2 data analysis. Data set contains a collection of soil caracteristics, measured co2 emission collected from incubation study. Soil samples was collected from two cranberry fied stand of eastern canada. Incubation study was carried out at Agriculture and Agri-food Canada(sainte-foy, quebec,qc) from February to Mai 2019. The aim of this study was to measure CO2 emission rates in cranberry soils of Eastern Canada as related to soil temperature and depth

2. Statistical questions

In addition to data exploration, this notebook will answer the following statistical questions.

  1. What is the influence of soil depth and temperature on CO2 emission?
  2. Can Arrhenius equation and Q10 be useful to describe temperature sensitivity of carbon decomposition across layers?

3. Packages

We need package tidyverse which loads a set of packages for easy data manipulation(Ex: dplyr) and visualization (ex: ggplot2). We also use ggpubr to customise publication ready plot, ggpmisc and grid are useful packages as extensions to ggplot2.

#install.packages(c("ggpubr", "ggpmisc", "tidyverse", "tidymodels", "plyr", "plotly"))
library(plyr)
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✓ ggplot2 3.3.5     ✓ purrr   0.3.4
✓ tibble  3.1.6     ✓ dplyr   1.0.7
✓ tidyr   1.1.4     ✓ stringr 1.4.0
✓ readr   2.1.1     ✓ forcats 0.5.1
── Conflicts ───────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::arrange()   masks plyr::arrange()
x purrr::compact()   masks plyr::compact()
x dplyr::count()     masks plyr::count()
x dplyr::failwith()  masks plyr::failwith()
x dplyr::filter()    masks stats::filter()
x dplyr::id()        masks plyr::id()
x dplyr::lag()       masks stats::lag()
x dplyr::mutate()    masks plyr::mutate()
x dplyr::rename()    masks plyr::rename()
x dplyr::summarise() masks plyr::summarise()
x dplyr::summarize() masks plyr::summarize()
library(tidymodels)
Registered S3 method overwritten by 'tune':
  method                   from   
  required_pkgs.model_spec parsnip
── Attaching packages ───────────────────────────────────────────────────────────────────────── tidymodels 0.1.4 ──
✓ broom        0.7.11     ✓ rsample      0.1.1 
✓ dials        0.0.10     ✓ tune         0.1.6 
✓ infer        1.0.0      ✓ workflows    0.2.4 
✓ modeldata    0.1.1      ✓ workflowsets 0.1.0 
✓ parsnip      0.1.7      ✓ yardstick    0.0.9 
✓ recipes      0.1.17     
Warning: package ‘broom’ was built under R version 4.1.2
── Conflicts ──────────────────────────────────────────────────────────────────────────── tidymodels_conflicts() ──
x dplyr::arrange()   masks plyr::arrange()
x purrr::compact()   masks plyr::compact()
x dplyr::count()     masks plyr::count()
x scales::discard()  masks purrr::discard()
x dplyr::failwith()  masks plyr::failwith()
x dplyr::filter()    masks stats::filter()
x recipes::fixed()   masks stringr::fixed()
x dplyr::id()        masks plyr::id()
x dplyr::lag()       masks stats::lag()
x dplyr::mutate()    masks plyr::mutate()
x dplyr::rename()    masks plyr::rename()
x yardstick::spec()  masks readr::spec()
x recipes::step()    masks stats::step()
x dplyr::summarise() masks plyr::summarise()
x dplyr::summarize() masks plyr::summarize()
• Dig deeper into tidy modeling with R at https://www.tmwr.org
library(ggpubr)

Attaching package: ‘ggpubr’

The following object is masked from ‘package:plyr’:

    mutate
library(ggpmisc)
Loading required package: ggpp

Attaching package: ‘ggpp’

The following object is masked from ‘package:ggplot2’:

    annotate

Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
library(grid)

4. Import data

We load two data data_pot and data_co2 involved in our anylisis. data_pot contained details about sites sampling, soil sampling(soil depth, weight, water content and bulk density), laboratory incubation temperature while data_co2 contained details about laboratory incubation time, co2 emission and jar masson details. data_co2 was combined with data_pot with left_join function

data_pots <- read_csv2('data/pots.csv')
ℹ Using "','" as decimal and "'.'" as grouping mark. Use `read_delim()` for more control.
Rows: 72 Columns: 12
── Column specification ───────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ";"
chr  (1): Sites
dbl (11): ID pot, Depth (cm), Repetition, Temperature (°C), Pot weight (g), Soil weight (g), Water volume (ml),...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
data_co2 <- read_csv('data/co2.csv')
Rows: 648 Columns: 5
── Column specification ───────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
dbl (5): ID pot, Time (days), Initial CO2 (ppm), Final CO2 (ppm), Time final (h)

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
data_co2 <- data_co2 %>%
left_join(data_pots, by = "ID pot")
data_pots

5. Some calculations

Several variables have been added to our data in order to proceed for analysis. The added variables are the following: Temperature (Kelvin), Molar Volume (L/mol), Headspace Volume (mL), Dry soil weight (g), CO2 emission (ug/h/g), CO2 emission (mg/kg), decomposition rate K, lnKand 1/T(T = Temperature(Kelvin)

container_volume <- 250 # mL
gas_constant <- 8.31446 # unit
atm_pressure_n <- 101.325

data_co2 <- data_co2 %>%
  mutate(`Temperature (K)` = `Temperature (°C)` + 273,
         `Total carbon (Mg/ha)` = `Bulk density (g/cm3)` * `Carbone(%)` * 10,
         `Molar Volume (L/mol)` = gas_constant * `Temperature (K)` / atm_pressure_n,
         `Headspace Volume (mL)` = container_volume - (`Soil weight (g)` / `Bulk density (g/cm3)`), # 250 mL is the volume of the container
         `Dry soil weight (g)` = `Soil weight (g)` - (`Soil weight (g)` * `Water content (%)` / 100),
         `CO2 emission (ug/h/g)` = (`Final CO2 (ppm)` - `Initial CO2 (ppm)`) * 0.000001 * 44000000 /
                                   `Molar Volume (L/mol)` * (`Headspace Volume (mL)` / 1000) * (12 / 44) /
                                   `Time final (h)` / `Dry soil weight (g)`,
         `CO2 emission (mg/kg)` = `CO2 emission (ug/h/g)` * 24 * `Time (days)`,
         `CO2 emission (Mg/ha)` = `CO2 emission (mg/kg)` * `Bulk density (g/cm3)` * 10 * 0.0001,
         K = log(`Total carbon (Mg/ha)` / (`Total carbon (Mg/ha)` - `CO2 emission (Mg/ha)`)) / `Time (days)`,
         lnK = log(K),
         `1/T` = 1 / `Temperature (K)`)
Warning: Problem with `mutate()` column `lnK`.
ℹ `lnK = log(K)`.
ℹ NaNs produced

6. Exploratory data analysis

6.1 Histogram

New.labs <- c("10°C", "20°C", "30°C") # Change labels 
names(New.labs) <- c("10", "20", "30")

New.labs_b <-  c("[0-10 cm]", "[10-20 cm]", "[20-30 cm]") # Change labels
names(New.labs_b) <- c("10", "20", "30")
library(plotly)
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following objects are masked from ‘package:plyr’:

    arrange, mutate, rename, summarise

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
ggplotly(  
data_co2 |>
  ggplot() +
  geom_histogram(aes(x = log10(`CO2 emission (ug/h/g)`)), bins = 100)
)
Warning in FUN(X[[i]], ...) : NaNs produced
Warning in FUN(X[[i]], ...) : NaNs produced
Warning: Removed 37 rows containing non-finite values (stat_bin).

Data contains some outliers, let remove them

data_co2_clean <- data_co2 |> 
  mutate(log_tr = log10(`CO2 emission (ug/h/g)`)) |>
  filter(log_tr > -3 & log_tr < -0.24) |>
  drop_na()
Warning: Problem with `mutate()` column `log_tr`.
ℹ `log_tr = log10(`CO2 emission (ug/h/g)`)`.
ℹ NaNs produced

Now data look well distributed

ggplotly(  
data_co2_clean |>
  ggplot() +
  geom_histogram(aes(x = log10(`CO2 emission (ug/h/g)`)), bins = 100) 
)

6.2 Correlations

data_co2_clean |>
  select(`Time (days)`, `Depth (cm)`, `Temperature (°C)`, `CO2 emission (ug/h/g)`) |>
  corrr::correlate() |>
  corrr::focus(`CO2 emission (ug/h/g)`) |>
  mutate(term = fct_reorder(term, `CO2 emission (ug/h/g)`)) |>
  ggplot(aes(x = `CO2 emission (ug/h/g)`, y= term)) +
  geom_col(width = 0.2) +
  labs(x = bquote(~CO[2]~ 'emision ('*mu~'g'~ h^-1~g^-1*')')) +
  theme_bw()

Correlation method: 'pearson'
Missing treated using: 'pairwise.complete.obs'

6.3 Boxplot

options(repr.plot.width = 6, repr.plot.height = 7)
pg <- ggplot(data=data_co2_clean, aes(x = `Time (days)`,y = `CO2 emission (ug/h/g)` )) +
geom_boxplot(aes(group = factor(`Time (days)`))) + 
facet_grid(`Depth (cm)` ~ `Temperature (°C)`,   scales = "free", 
          labeller = labeller(`Depth (cm)` = New.labs_b, `Temperature (°C)` = New.labs))+ 
 labs(x = "Incubation time (days)", y = bquote(~CO[2]~ 'emision ('*mu~'g'~ h^-1~g^-1*')'))
pg 
ggsave("figures/Boxplot.png", width = 6, height = 7, dpi = 600)# export plot high resolution

7.What is the influence of soil depth and temperature on CO2 emission?

7.1 Build model: linear regression

model_rec <-  data_co2_clean |>
  recipe(`CO2 emission (ug/h/g)` ~ ., data_co2) |>
  step_select(`CO2 emission (ug/h/g)`, `Time (days)`, `Depth (cm)`, `Temperature (°C)`) |>
  step_log(all_outcomes(), base = 10) |>
  step_normalize(all_numeric(), -all_outcomes() ) |>
  prep()

data_co2_preprocessed <-  juice(model_rec)

model_spec <- linear_reg() |>
  set_engine("lm")

Fit model

model_fit <- model_spec |>
  fit(`CO2 emission (ug/h/g)` ~ ., data_co2_preprocessed)

Exploring model results

tidy(model_fit)
glance(model_fit)

Inspect the model

par(mfrow=c(2,2)) # plot all 4 plots in one

plot(model_fit$fit, 
     pch = 16,    
     col = '#006EA1')

Prediction

prediction <-  model_fit |>
  predict(data_co2_preprocessed)

collect Metrics

rmse <-  data_co2_preprocessed |>
  bind_cols(prediction) |>
  rmse(`CO2 emission (ug/h/g)`, .pred)
rmse
rmse <-  round(as.numeric(rmse[1,3]), 2)
rsq <-  data_co2_preprocessed |>
  bind_cols(prediction) |>
  rsq(`CO2 emission (ug/h/g)`, .pred)
rsq
rsq <- round(as.numeric(rsq[1,3]), 2)
data_co2_preprocessed |>
  bind_cols(prediction) |>
  ggplot(aes(x = `CO2 emission (ug/h/g)`, y = .pred)) +
  geom_point() +
  geom_label(aes(x = -3, y = -0.5),
              vjust = 1, hjust = 0,
               label = paste("R² =",  rsq, "\nRMSE =", rmse)) +
  geom_abline(color = "red") +
  labs(x= bquote("Observed log"~CO[2]~ 'emision ('*mu~'g'~ h^-1~g^-1*')') , y = bquote("Predicted log"~CO[2]~ 'emision ('*mu~'g'~ h^-1~g^-1*')'))

7.3 Variable coefficient and confidence intervals

options(repr.plot.width = 8, repr.plot.height = 2)
h <- broom::tidy(model_fit, conf.int = TRUE) |>
  dplyr::filter(term != "(Intercept)") |>
  ggplot(aes(estimate, term)) +
  geom_vline(xintercept = 0, linetype = 2) +
  geom_point() +
  geom_errorbarh(aes(xmin = conf.low, xmax = conf.high), height = 0.1,
                  size=0.5) +
  labs(x = "Coefficient", y = "") +
  theme_light()
h + theme(axis.text = element_text(face = "bold"))
ggsave("figures/Linear-model-Co2.png", width = 8, height = 2, dpi = 600)

7.3 Prediction model of CO2 emission in cranberry soils in three-layer positions (0-10 cm, 10-20 cm, 20-30 cm) and at three temperatures (10, 20 and 30oC).

New.labs <- c("10°C", "20°C", "30°C") # Change labels 
names(New.labs) <- c("10", "20", "30")

New.labs_b <-  c("[0-10 cm]", "[10-20 cm]", "[20-30 cm]") # Change labels
names(New.labs_b) <- c("10", "20", "30")

options(repr.plot.width = 8, repr.plot.height = 6)
pl <- data_co2_clean |>
  bind_cols(10^prediction) |>
 ggplot(aes(x = `Time (days)`, y = `CO2 emission (ug/h/g)`)) +
  geom_point(size = 1.5, alpha = 0.4) +
 facet_grid(`Depth (cm)` ~ `Temperature (°C)`, scales = "free", labeller = labeller(`Depth (cm)` = New.labs_b, `Temperature (°C)` = New.labs)) +
  geom_line(aes(x = `Time (days)`, y = `.pred`)) +
scale_y_log10() +
theme_bw() +
  xlab("Incubation time (days)") + ylab(bquote(~CO[2]~ 'emision rate ('*mu~'g'~ h^-1~g^-1*')'))
  
pl + theme(axis.text = element_text(face = "bold"),
           strip.text = element_text(face = "bold"), axis.title.y = element_text(face = "bold"),
        axis.title=element_text(face = "bold"))
  
ggsave("figures/CO2 emission.png", plot= pl, width = 9, height = 7, dpi = 600)# export plot high resolution

8. What is the temperature sensitivity across cranberry soil layers?

8.1 Fit of Arrhenius equation

The Arrhenius equation has been used to describe temperature sensitivity to CO2 emission. The Arrhenius equation was computed as follows:

\[k = A e^{{\frac{-Ea}{RT}}}\]

\[log \left( k \right) = log \left( A e^{\frac{-Ea}{RT}} \right)\]

\[log \left( k \right) = log \left( A \right) + log \left(e^{\frac{-Ea}{RT}} \right)\]

\[log \left( k \right) = log \left( A \right) - \frac{1}{T} \times \left(\frac{Ea}{R}\right)\]

Where \(A\) is the pre-exponential factor and \(Ea\) is activation energy assumed to be independent of temperature, \(R\) is the universal gas constant and \(T\) is absolute temperature (Kelvin)

models_co2 <- data_co2 %>%
  group_by(`Depth (cm)`) %>%
  summarise(linmod = list(lm(lnK ~ `1/T`)))
models_co2
linmod_coef <- list()
for (i in seq_along(models_co2$linmod)) linmod_coef[[i]] <- models_co2$linmod[[i]]$coefficients
linmod_coef <- do.call(rbind.data.frame, linmod_coef)
names(linmod_coef) <- c("Intercept", "Slope")
linmod_coef <- bind_cols(unique(data_co2["Depth (cm)"]), linmod_coef)
linmod_coef
options(repr.plot.width = 12, repr.plot.height = 6)
  plot_co2 <- data_co2_clean %>%
  ggplot(aes(x = `1/T`, y = lnK)) +
  facet_grid(~`Depth (cm)`, labeller = labeller(`Depth (cm)` = New.labs_b)) +
  geom_boxplot(aes(group = factor(`1/T`))) +
stat_regline_equation(aes(label =  paste(..eq.label.., ..rr.label.., sep = "~~")), label.x = 0.00331, label.y = -7) +
  geom_abline(data = linmod_coef, aes(intercept = Intercept, slope = Slope), lwd = 1) +
  labs(y = "ln(K)") +
theme_bw() +
theme(strip.text = element_text(face = "bold"), axis.text=element_text(face = "bold"),
        axis.title=element_text(face = "bold")) 
plot_co2
ggsave("figures/Arrhénius équation.png", plot = plot_co2, width = 8, height = 4, dpi = 600)# export plot high resolution

8.2 Activation Energy computation

Activation_energy <- tibble(
    Soil_layers = c("10", "20", "30"),
    intercept = NA,
    slope = NA,
    adj_r_sq = NA
)
lm_arrhenius <- for (i in 1:nrow(Activation_energy)) {
    
    lm_Activation_energy <- data_co2_clean %>%
      filter(`Depth (cm)` == Activation_energy$Soil_layers[i]) %>%
      lm(lnK ~ `1/T`, data = .)
    
    # intercept
    Activation_energy$intercept[i] <- coef(lm_Activation_energy)[1]

    # Slope
     Activation_energy$slope[i] <- coef(lm_Activation_energy)[2]
   
    # statistics
    Activation_energy$adj_r_sq[i] <- summary(lm_Activation_energy)$adj.r.squared
}
R = 8.3144621 / 1000 # Gas constant Kj/mol/K 
Activation_energy <-  Activation_energy %>%
  mutate(Ea = -slope * R) %>%
  select(Soil_layers, adj_r_sq, Ea)
Activation_energy

8.3 Computing K median in order to compute Q10 value accross soil depth

K_median <- aggregate(K ~ `Depth (cm)` + `Temperature (°C)`, data = data_co2_clean, FUN = mean)
K_median_01 <- K_median %>%
  pivot_wider(names_from = `Temperature (°C)`, values_from = K)

K_median_01$Q_20_10 <- K_median_01$`20` / K_median_01$`10`
K_median_01$Q_30_20 <- K_median_01$`30` / K_median_01$`20`
K_median_01
K_median_02 <- aggregate(K ~ `Sites` + `Time (days)` + `Depth (cm)` + `Temperature (°C)`, data = data_co2_clean, FUN = median)

K_median_02 <- K_median_02 %>%
  pivot_wider(names_from = `Temperature (°C)`, values_from = K)

#K_median_02
K_median_02$Q_20_10 <- K_median_02$`20` / K_median_02$`10`
K_median_02$Q_30_20 <- K_median_02$`30` / K_median_02$`20`
K_median_02 <- K_median_02 %>%
na.omit(K_median_02)
data_Q10 <- gather(data = K_median_02, key = `Temperature range`, value = Q10, c(`Q_20_10`, `Q_30_20`),
                    factor_key=TRUE)

mean_sd_Q10 <- ddply(data_Q10, ~ `Depth (cm)`,
                  summarise, Q10_mean = mean(Q10, na.rm = TRUE), Q10_se = sd(Q10, na.rm = TRUE) / sqrt(dim(data_Q10)[1]))
mean_sd_Q10
data_Q10$Log_Q10 <- log10(data_Q10$Q10)

Q10_lm <- lm(log(Q10) ~ `Depth (cm)`,
                     data = data_Q10) 
summary(Q10_lm)

Call:
lm(formula = log(Q10) ~ `Depth (cm)`, data = data_Q10)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.36239 -0.17136 -0.03651  0.18061  0.98166 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.572708   0.084735   6.759 1.16e-09 ***
`Depth (cm)` 0.010764   0.004172   2.580   0.0114 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3191 on 94 degrees of freedom
Multiple R-squared:  0.06614,   Adjusted R-squared:  0.0562 
F-statistic: 6.657 on 1 and 94 DF,  p-value: 0.01143
options(repr.plot.width = 8, repr.plot.height = 4)
data_Q10$`Layers` <- as.character(data_Q10$`Depth (cm)`)
ggplot(data=data_Q10, aes(x = `Time (days)`, y = `Q10`)) +
facet_grid(.~`Depth (cm)`, labeller = labeller(`Depth (cm)` = New.labs_b)) +
geom_smooth(method = "lm", se = TRUE, color = "Black") +
geom_point(size = 1.5, alpha = 0.5) +
theme_bw() + 
theme(strip.text = element_text(face = "bold"), axis.text=element_text(face = "bold"),
        axis.title=element_text(face = "bold")) 
`geom_smooth()` using formula 'y ~ x'
ggsave("figures/Variation of Q10 across layers.png", width = 8, height = 4, dpi = 600)# export plot high resolution
`geom_smooth()` using formula 'y ~ x'

9. Soil description

9.1 Soil layers properties

Import data

data_carbon_credit <- read_csv2('data/data_carbon_credit.csv')
ℹ Using "','" as decimal and "'.'" as grouping mark. Use `read_delim()` for more control.
Rows: 24 Columns: 15
── Column specification ───────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ";"
chr  (3): Location, Layer (cm), 0_30_ID
dbl (12): Sample, Site age, Repetition, Bulk density (kg m-3), pHCaCl2, Sand carbon (%), Carbone (%), Sulfur (%...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
data_carbon_credit <- data_carbon_credit %>%
mutate(`C:N ratio` = `Carbone (%)` / `Nitrogen (%)`)

Some calculations

names(data_carbon_credit)
 [1] "Sample"                "Location"              "Layer (cm)"            "0_30_ID"              
 [5] "Site age"              "Repetition"            "Bulk density (kg m-3)" "pHCaCl2"              
 [9] "Sand carbon (%)"       "Carbone (%)"           "Sulfur (%)"            "Nitrogen (%)"         
[13] "C stock (kg m-3)"      "Total porosity"        "Water content (%)"     "C:N ratio"            
data_carbon_credit$`Total porosity`
 [1] 0.7 0.5 0.5 0.7 0.5 0.5 0.7 0.5 0.5 0.7 0.5 0.5 0.6 0.4 0.4 0.6 0.4 0.4 0.6 0.4 0.4 0.6 0.4 0.4
mean_sd_CoverN <- ddply(data_carbon_credit, ~ `Layer (cm)`,
                       summarise, mean_CoverN = mean(`C:N ratio`, na.rm = TRUE), 
                        se_CoverN = sd(`C:N ratio`, na.rm = TRUE)/sqrt(length(!is.na(`C:N ratio`))))
mean_sd_CoverN

plot_desc <- function(y, ylab){
  New.labs_c <-  c("Site/A9", "Site/45") # Change labels
names(New.labs_c) <- c("Belanger/ A9", "Fortier/ 45")
  ggplot(data_carbon_credit, aes(`Layer (cm)`, y)) +
facet_grid( . ~ `Location`, scales = "free", labeller = labeller(`Location` = New.labs_c)) +
geom_boxplot() + 
theme(strip.text = element_text(size = 11), axis.text=element_text(size=11),
        axis.title=element_text(size=11)) +
    labs(y = ylab)
  }

plot1 <- plot_desc(data_carbon_credit$`C stock (kg m-3)`, "C stock (kg m-3)")
plot2 <- plot_desc(data_carbon_credit$`C:N ratio`, "C:N ratio")
plot3 <- plot_desc(data_carbon_credit$`Bulk density (kg m-3)`, "Bulk density (kg m-3)")
plot4 <- plot_desc(data_carbon_credit$pHCaCl2, "pHCaCl2")
plot5 <- plot_desc(data_carbon_credit$`Total porosity`, "Total porosity")
plot6 <- plot_desc(data_carbon_credit$`Water content (%)`, "Water content (%)")

options(repr.plot.width = 8, repr.plot.height = 6)
figure <- ggarrange(plot1, plot2, plot3, plot4, plot5, plot6,
                    labels = c("A", "B", "C", "D", "E", "F"), label.x = 0.05, label.y = 1.01,
                    ncol = 2, nrow = 3)
figure
ggsave("figures/Soil description.png", width = 8, height = 5, dpi = 600)# export plot high resolution

9.2 C:N ratio in alternate sublayers of sand and organic matter

Data loading

Carbon_credit <- read_csv2('data/data_carbon_sublayer.csv')
ℹ Using "','" as decimal and "'.'" as grouping mark. Use `read_delim()` for more control.
Rows: 23 Columns: 20
── Column specification ───────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ";"
chr  (6): Projet, Site, Horizon, Layers, Soil texture, Munsell_color
dbl (14): Depht (cm), Thickness(cm), Bulk density(kg m-3), Site_age, Weigh_superior_2MM, Weigh _0_2MM, Repetiti...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Carbon_credit

C:N ratio computation

Carbon_credit <- Carbon_credit %>%
mutate(`C/N` = C_pourc/N_pourc)

Generating the plots

options(repr.plot.width=8, repr.plot.height=4)
pd <- position_dodge(width = 0.2)
New.labs_d <-  c("Site/A9", "Site/45") # Change labels
names(New.labs_d) <- c("Belanger/A9", "Fortier/45")

p <- ggplot(data=Carbon_credit, aes(x= `Depht (cm)`, y= `C/N`)) +
facet_grid(.~Site, labeller = labeller(`Site` = New.labs_d)) +
geom_line(linetype = "twodash") +
geom_point(aes(shape = `Soil texture`, fill = `Soil texture`), size = 3) +
scale_shape_manual(values=c(21, 21))+
scale_fill_manual(values = c("#000000", "#FFFFFF")) +
scale_y_continuous(breaks = 5*0:1000,
                     expand = expand_scale(add = 5)) +
scale_x_continuous(breaks = 5*0:1000,
                     expand = expand_scale(add = 5)) +
theme(strip.text = element_text(face = "bold"), axis.text=element_text(face = "bold"),
        axis.title=element_text(face = "bold") , legend.title= element_text(face = "bold"),
     legend.text = element_text(face = "bold")) +
  labs(y= "C/N Ratio") 
Warning: `expand_scale()` is deprecated; use `expansion()` instead.
Warning: `expand_scale()` is deprecated; use `expansion()` instead.
p + coord_flip()
ggsave("figures/(C_over_N).png", width = 8, height = 4, dpi = 800)

LS0tCnRpdGxlOiAiVW50aXRsZWQiCmF1dGhvcjogIndpbGZyaWVkIgpkYXRlOiAiMTMvMDIvMjAyMiIKb3V0cHV0OgogIHBkZl9kb2N1bWVudDogZGVmYXVsdAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKLS0tCgojIFRlbXBlcmF0dXJlIHNlbnNpdGl2aXR5IG9mIENPMiBlbWlzc2lvbnMgaW4gbGF5ZXJlZCBjcmFuYmVycnkgc29pbHMKKldpbGZyaWVkIERvc3NvdS1Zb3ZvLCBTZXJnZSDDiXRpZW5uZSBQYXJlbnQsTm91cmEgWmlhZGksIEJlcnRyYW5kIE5vcm1hbmQsIGFuZCBMw6lvbiDDiXRpZW5uZSBwYXJlbnQqCgpgYGB7cn0KcHJpbnQoU3lzLkRhdGUoKSkKYGBgCgojIyAxLiBPYmplY3RpdmUKClRoaXMgbm90ZWJvb2sgZ2VuZXJhdGUgdGhlIHJlc3VsdCBvZiBDTzIgZGF0YSBhbmFseXNpcy4gRGF0YSBzZXQgY29udGFpbnMgYSBjb2xsZWN0aW9uIG9mIHNvaWwgY2FyYWN0ZXJpc3RpY3MsIG1lYXN1cmVkIGNvMiBlbWlzc2lvbiBjb2xsZWN0ZWQgZnJvbSBpbmN1YmF0aW9uIHN0dWR5LiBTb2lsIHNhbXBsZXMgd2FzIGNvbGxlY3RlZCBmcm9tIHR3byBjcmFuYmVycnkgZmllZCBzdGFuZCBvZiBlYXN0ZXJuIGNhbmFkYS4gSW5jdWJhdGlvbiBzdHVkeSB3YXMgY2FycmllZCBvdXQgYXQgQWdyaWN1bHR1cmUgYW5kIEFncmktZm9vZCBDYW5hZGEoc2FpbnRlLWZveSwgcXVlYmVjLHFjKSBmcm9tIEZlYnJ1YXJ5IHRvIE1haSAyMDE5LiBUaGUgYWltIG9mIHRoaXMgc3R1ZHkgd2FzIHRvIG1lYXN1cmUgQ08yIGVtaXNzaW9uIHJhdGVzIGluIGNyYW5iZXJyeSBzb2lscyBvZiBFYXN0ZXJuIENhbmFkYSBhcyByZWxhdGVkIHRvIHNvaWwgdGVtcGVyYXR1cmUgYW5kIGRlcHRoCgojIyAyLiBTdGF0aXN0aWNhbCBxdWVzdGlvbnMKCkluIGFkZGl0aW9uIHRvIGRhdGEgZXhwbG9yYXRpb24sIHRoaXMgbm90ZWJvb2sgd2lsbCBhbnN3ZXIgdGhlIGZvbGxvd2luZyBzdGF0aXN0aWNhbCBxdWVzdGlvbnMuCiAKMS4gV2hhdCBpcyB0aGUgaW5mbHVlbmNlIG9mIHNvaWwgZGVwdGggYW5kIHRlbXBlcmF0dXJlIG9uIENPMiBlbWlzc2lvbj8KMi4gQ2FuIEFycmhlbml1cyBlcXVhdGlvbiBhbmQgUTEwIGJlIHVzZWZ1bCB0byBkZXNjcmliZSB0ZW1wZXJhdHVyZSBzZW5zaXRpdml0eSBvZiBjYXJib24gZGVjb21wb3NpdGlvbiBhY3Jvc3MgbGF5ZXJzPyAKCiMjIDMuIFBhY2thZ2VzCgpXZSBuZWVkIHBhY2thZ2UgW3RpZHl2ZXJzZV0oaHR0cHM6Ly93d3cudGlkeXZlcnNlLm9yZy8pIHdoaWNoIGxvYWRzIGEgc2V0IG9mIHBhY2thZ2VzIGZvciBlYXN5IGRhdGEgbWFuaXB1bGF0aW9uKEV4OiBbZHBseXJdKGh0dHBzOi8vd3d3LnJkb2N1bWVudGF0aW9uLm9yZy9wYWNrYWdlcy9kcGx5ci92ZXJzaW9ucy8wLjcuOCkpIGFuZCB2aXN1YWxpemF0aW9uIChleDogW2dncGxvdDJdKGh0dHBzOi8vd3d3LnJkb2N1bWVudGF0aW9uLm9yZy9wYWNrYWdlcy9nZ3Bsb3QyL3ZlcnNpb25zLzMuMi4xKSkuIFdlIGFsc28gdXNlIFtnZ3B1YnJdKGh0dHBzOi8vd3d3LnJkb2N1bWVudGF0aW9uLm9yZy9wYWNrYWdlcy9nZ3B1YnIvdmVyc2lvbnMvMC4xLjEpIHRvIGN1c3RvbWlzZSBwdWJsaWNhdGlvbiByZWFkeSBwbG90LCBbZ2dwbWlzY10oaHR0cHM6Ly93d3cucmRvY3VtZW50YXRpb24ub3JnL3BhY2thZ2VzL2dncG1pc2MvdmVyc2lvbnMvMC4yLjE3KSBhbmQgW2dyaWRdKGh0dHBzOi8vd3d3LnJkb2N1bWVudGF0aW9uLm9yZy9wYWNrYWdlcy9ncmlkL3ZlcnNpb25zLzMuNi4yKSBhcmUgdXNlZnVsIHBhY2thZ2VzIGFzIGV4dGVuc2lvbnMgdG8gW2dncGxvdDJdKGh0dHBzOi8vd3d3LnJkb2N1bWVudGF0aW9uLm9yZy9wYWNrYWdlcy9nZ3Bsb3QyL3ZlcnNpb25zLzMuMi4xKS4KCmBgYHtyfQojaW5zdGFsbC5wYWNrYWdlcyhjKCJnZ3B1YnIiLCAiZ2dwbWlzYyIsICJ0aWR5dmVyc2UiLCAidGlkeW1vZGVscyIsICJwbHlyIiwgInBsb3RseSIpKQpsaWJyYXJ5KHBseXIpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHRpZHltb2RlbHMpCmxpYnJhcnkoZ2dwdWJyKQpsaWJyYXJ5KGdncG1pc2MpCmxpYnJhcnkoZ3JpZCkKYGBgCgojIyMgNC4gSW1wb3J0IGRhdGEKV2UgbG9hZCB0d28gZGF0YSBgZGF0YV9wb3RgIGFuZCBgZGF0YV9jbzJgIGludm9sdmVkIGluIG91ciBhbnlsaXNpcy4gYGRhdGFfcG90YCBjb250YWluZWQgZGV0YWlscyBhYm91dCBzaXRlcyBzYW1wbGluZywgc29pbCBzYW1wbGluZyhzb2lsIGRlcHRoLCB3ZWlnaHQsIHdhdGVyIGNvbnRlbnQgYW5kIGJ1bGsgZGVuc2l0eSksIGxhYm9yYXRvcnkgaW5jdWJhdGlvbiB0ZW1wZXJhdHVyZSB3aGlsZSBgZGF0YV9jbzJgIGNvbnRhaW5lZCBkZXRhaWxzIGFib3V0IGxhYm9yYXRvcnkgaW5jdWJhdGlvbiB0aW1lLCBjbzIgZW1pc3Npb24gYW5kIGphciBtYXNzb24gZGV0YWlscy4KYGRhdGFfY28yYCB3YXMgY29tYmluZWQgd2l0aCBgZGF0YV9wb3RgIHdpdGggYGxlZnRfam9pbmAgZnVuY3Rpb24KCmBgYHtyfQpkYXRhX3BvdHMgPC0gcmVhZF9jc3YyKCdkYXRhL3BvdHMuY3N2JykKZGF0YV9jbzIgPC0gcmVhZF9jc3YoJ2RhdGEvY28yLmNzdicpCmRhdGFfY28yIDwtIGRhdGFfY28yICU+JQpsZWZ0X2pvaW4oZGF0YV9wb3RzLCBieSA9ICJJRCBwb3QiKQpkYXRhX3BvdHMKYGBgCgojIyA1LiBTb21lIGNhbGN1bGF0aW9ucyAKClNldmVyYWwgdmFyaWFibGVzIGhhdmUgYmVlbiBhZGRlZCB0byBvdXIgZGF0YSBpbiBvcmRlciB0byBwcm9jZWVkIGZvciBhbmFseXNpcy4gVGhlIGFkZGVkIHZhcmlhYmxlcyBhcmUgdGhlIGZvbGxvd2luZzogYFRlbXBlcmF0dXJlIChLZWx2aW4pYCwgYE1vbGFyIFZvbHVtZSAoTC9tb2wpYCwgYEhlYWRzcGFjZSBWb2x1bWUgKG1MKWAsIGBEcnkgc29pbCB3ZWlnaHQgKGcpYCwgYENPMiBlbWlzc2lvbiAodWcvaC9nKWAsIGBDTzIgZW1pc3Npb24gKG1nL2tnKWAsIGBkZWNvbXBvc2l0aW9uIHJhdGUgS2AsIGBsbktgYW5kIGAxL1QoVCA9IFRlbXBlcmF0dXJlKEtlbHZpbilgCgpgYGB7cn0KY29udGFpbmVyX3ZvbHVtZSA8LSAyNTAgIyBtTApnYXNfY29uc3RhbnQgPC0gOC4zMTQ0NiAjIHVuaXQKYXRtX3ByZXNzdXJlX24gPC0gMTAxLjMyNQoKZGF0YV9jbzIgPC0gZGF0YV9jbzIgJT4lCiAgbXV0YXRlKGBUZW1wZXJhdHVyZSAoSylgID0gYFRlbXBlcmF0dXJlICjCsEMpYCArIDI3MywKICAgICAgICAgYFRvdGFsIGNhcmJvbiAoTWcvaGEpYCA9IGBCdWxrIGRlbnNpdHkgKGcvY20zKWAgKiBgQ2FyYm9uZSglKWAgKiAxMCwKICAgICAgICAgYE1vbGFyIFZvbHVtZSAoTC9tb2wpYCA9IGdhc19jb25zdGFudCAqIGBUZW1wZXJhdHVyZSAoSylgIC8gYXRtX3ByZXNzdXJlX24sCiAgICAgICAgIGBIZWFkc3BhY2UgVm9sdW1lIChtTClgID0gY29udGFpbmVyX3ZvbHVtZSAtIChgU29pbCB3ZWlnaHQgKGcpYCAvIGBCdWxrIGRlbnNpdHkgKGcvY20zKWApLCAjIDI1MCBtTCBpcyB0aGUgdm9sdW1lIG9mIHRoZSBjb250YWluZXIKICAgICAgICAgYERyeSBzb2lsIHdlaWdodCAoZylgID0gYFNvaWwgd2VpZ2h0IChnKWAgLSAoYFNvaWwgd2VpZ2h0IChnKWAgKiBgV2F0ZXIgY29udGVudCAoJSlgIC8gMTAwKSwKICAgICAgICAgYENPMiBlbWlzc2lvbiAodWcvaC9nKWAgPSAoYEZpbmFsIENPMiAocHBtKWAgLSBgSW5pdGlhbCBDTzIgKHBwbSlgKSAqIDAuMDAwMDAxICogNDQwMDAwMDAgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBNb2xhciBWb2x1bWUgKEwvbW9sKWAgKiAoYEhlYWRzcGFjZSBWb2x1bWUgKG1MKWAgLyAxMDAwKSAqICgxMiAvIDQ0KSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRpbWUgZmluYWwgKGgpYCAvIGBEcnkgc29pbCB3ZWlnaHQgKGcpYCwKICAgICAgICAgYENPMiBlbWlzc2lvbiAobWcva2cpYCA9IGBDTzIgZW1pc3Npb24gKHVnL2gvZylgICogMjQgKiBgVGltZSAoZGF5cylgLAogICAgICAgICBgQ08yIGVtaXNzaW9uIChNZy9oYSlgID0gYENPMiBlbWlzc2lvbiAobWcva2cpYCAqIGBCdWxrIGRlbnNpdHkgKGcvY20zKWAgKiAxMCAqIDAuMDAwMSwKICAgICAgICAgSyA9IGxvZyhgVG90YWwgY2FyYm9uIChNZy9oYSlgIC8gKGBUb3RhbCBjYXJib24gKE1nL2hhKWAgLSBgQ08yIGVtaXNzaW9uIChNZy9oYSlgKSkgLyBgVGltZSAoZGF5cylgLAogICAgICAgICBsbksgPSBsb2coSyksCiAgICAgICAgIGAxL1RgID0gMSAvIGBUZW1wZXJhdHVyZSAoSylgKQpgYGAKCiMjIDYuIEV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMKCiMjIyA2LjEgSGlzdG9ncmFtCgpgYGB7cn0KTmV3LmxhYnMgPC0gYygiMTDCsEMiLCAiMjDCsEMiLCAiMzDCsEMiKSAjIENoYW5nZSBsYWJlbHMgCm5hbWVzKE5ldy5sYWJzKSA8LSBjKCIxMCIsICIyMCIsICIzMCIpCgpOZXcubGFic19iIDwtICBjKCJbMC0xMCBjbV0iLCAiWzEwLTIwIGNtXSIsICJbMjAtMzAgY21dIikgIyBDaGFuZ2UgbGFiZWxzCm5hbWVzKE5ldy5sYWJzX2IpIDwtIGMoIjEwIiwgIjIwIiwgIjMwIikKYGBgCgpgYGB7cn0KbGlicmFyeShwbG90bHkpCmdncGxvdGx5KCAgCmRhdGFfY28yIHw+CiAgZ2dwbG90KCkgKwogIGdlb21faGlzdG9ncmFtKGFlcyh4ID0gbG9nMTAoYENPMiBlbWlzc2lvbiAodWcvaC9nKWApKSwgYmlucyA9IDEwMCkKKQpgYGAKCkRhdGEgY29udGFpbnMgc29tZSBvdXRsaWVycywgbGV0IHJlbW92ZSB0aGVtCgpgYGB7cn0KZGF0YV9jbzJfY2xlYW4gPC0gZGF0YV9jbzIgfD4gCiAgbXV0YXRlKGxvZ190ciA9IGxvZzEwKGBDTzIgZW1pc3Npb24gKHVnL2gvZylgKSkgfD4KICBmaWx0ZXIobG9nX3RyID4gLTMgJiBsb2dfdHIgPCAtMC4yNCkgfD4KICBkcm9wX25hKCkKYGBgCgpOb3cgZGF0YSBsb29rIHdlbGwgZGlzdHJpYnV0ZWQKYGBge3J9CmdncGxvdGx5KCAgCmRhdGFfY28yX2NsZWFuIHw+CiAgZ2dwbG90KCkgKwogIGdlb21faGlzdG9ncmFtKGFlcyh4ID0gbG9nMTAoYENPMiBlbWlzc2lvbiAodWcvaC9nKWApKSwgYmlucyA9IDEwMCkgCikKYGBgCgoKIyMjIDYuMiBDb3JyZWxhdGlvbnMKCmBgYHtyfQpkYXRhX2NvMl9jbGVhbiB8PgogIHNlbGVjdChgVGltZSAoZGF5cylgLCBgRGVwdGggKGNtKWAsIGBUZW1wZXJhdHVyZSAowrBDKWAsIGBDTzIgZW1pc3Npb24gKHVnL2gvZylgKSB8PgogIGNvcnJyOjpjb3JyZWxhdGUoKSB8PgogIGNvcnJyOjpmb2N1cyhgQ08yIGVtaXNzaW9uICh1Zy9oL2cpYCkgfD4KICBtdXRhdGUodGVybSA9IGZjdF9yZW9yZGVyKHRlcm0sIGBDTzIgZW1pc3Npb24gKHVnL2gvZylgKSkgfD4KICBnZ3Bsb3QoYWVzKHggPSBgQ08yIGVtaXNzaW9uICh1Zy9oL2cpYCwgeT0gdGVybSkpICsKICBnZW9tX2NvbCh3aWR0aCA9IDAuMikgKwogIGxhYnMoeCA9IGJxdW90ZSh+Q09bMl1+ICdlbWlzaW9uICgnKm11fidnJ34gaF4tMX5nXi0xKicpJykpICsKICB0aGVtZV9idygpCmBgYAoKIyMjIDYuMyBCb3hwbG90CgpgYGB7cn0Kb3B0aW9ucyhyZXByLnBsb3Qud2lkdGggPSA2LCByZXByLnBsb3QuaGVpZ2h0ID0gNykKcGcgPC0gZ2dwbG90KGRhdGE9ZGF0YV9jbzJfY2xlYW4sIGFlcyh4ID0gYFRpbWUgKGRheXMpYCx5ID0gYENPMiBlbWlzc2lvbiAodWcvaC9nKWAgKSkgKwpnZW9tX2JveHBsb3QoYWVzKGdyb3VwID0gZmFjdG9yKGBUaW1lIChkYXlzKWApKSkgKyAKZmFjZXRfZ3JpZChgRGVwdGggKGNtKWAgfiBgVGVtcGVyYXR1cmUgKMKwQylgLCAgIHNjYWxlcyA9ICJmcmVlIiwgCiAgICAgICAgICBsYWJlbGxlciA9IGxhYmVsbGVyKGBEZXB0aCAoY20pYCA9IE5ldy5sYWJzX2IsIGBUZW1wZXJhdHVyZSAowrBDKWAgPSBOZXcubGFicykpKyAKIGxhYnMoeCA9ICJJbmN1YmF0aW9uIHRpbWUgKGRheXMpIiwgeSA9IGJxdW90ZSh+Q09bMl1+ICdlbWlzaW9uICgnKm11fidnJ34gaF4tMX5nXi0xKicpJykpCnBnIApnZ3NhdmUoImZpZ3VyZXMvQm94cGxvdC5wbmciLCB3aWR0aCA9IDYsIGhlaWdodCA9IDcsIGRwaSA9IDYwMCkjIGV4cG9ydCBwbG90IGhpZ2ggcmVzb2x1dGlvbgpgYGAKCiMjIDcuV2hhdCBpcyB0aGUgaW5mbHVlbmNlIG9mIHNvaWwgZGVwdGggYW5kIHRlbXBlcmF0dXJlIG9uIENPMiBlbWlzc2lvbj8KCiMjIyA3LjEgQnVpbGQgbW9kZWw6IGxpbmVhciByZWdyZXNzaW9uCgpgYGB7cn0KbW9kZWxfcmVjIDwtICBkYXRhX2NvMl9jbGVhbiB8PgogIHJlY2lwZShgQ08yIGVtaXNzaW9uICh1Zy9oL2cpYCB+IC4sIGRhdGFfY28yKSB8PgogIHN0ZXBfc2VsZWN0KGBDTzIgZW1pc3Npb24gKHVnL2gvZylgLCBgVGltZSAoZGF5cylgLCBgRGVwdGggKGNtKWAsIGBUZW1wZXJhdHVyZSAowrBDKWApIHw+CiAgc3RlcF9sb2coYWxsX291dGNvbWVzKCksIGJhc2UgPSAxMCkgfD4KICBzdGVwX25vcm1hbGl6ZShhbGxfbnVtZXJpYygpLCAtYWxsX291dGNvbWVzKCkgKSB8PgogIHByZXAoKQoKZGF0YV9jbzJfcHJlcHJvY2Vzc2VkIDwtICBqdWljZShtb2RlbF9yZWMpCgptb2RlbF9zcGVjIDwtIGxpbmVhcl9yZWcoKSB8PgogIHNldF9lbmdpbmUoImxtIikKYGBgCgojIyMjIEZpdCBtb2RlbApgYGB7cn0KbW9kZWxfZml0IDwtIG1vZGVsX3NwZWMgfD4KICBmaXQoYENPMiBlbWlzc2lvbiAodWcvaC9nKWAgfiAuLCBkYXRhX2NvMl9wcmVwcm9jZXNzZWQpCmBgYAoKCiMjIyMgRXhwbG9yaW5nIG1vZGVsIHJlc3VsdHMKYGBge3J9CnRpZHkobW9kZWxfZml0KQpgYGAKCmBgYHtyfQpnbGFuY2UobW9kZWxfZml0KQpgYGAKCiMjIyMgSW5zcGVjdCB0aGUgbW9kZWwKYGBge3J9CnBhcihtZnJvdz1jKDIsMikpICMgcGxvdCBhbGwgNCBwbG90cyBpbiBvbmUKCnBsb3QobW9kZWxfZml0JGZpdCwgCiAgICAgcGNoID0gMTYsICAgIAogICAgIGNvbCA9ICcjMDA2RUExJykKYGBgCgojIyMjIFByZWRpY3Rpb24KYGBge3J9CnByZWRpY3Rpb24gPC0gIG1vZGVsX2ZpdCB8PgogIHByZWRpY3QoZGF0YV9jbzJfcHJlcHJvY2Vzc2VkKQpgYGAKCiMjIyMgY29sbGVjdCBNZXRyaWNzCmBgYHtyfQpybXNlIDwtICBkYXRhX2NvMl9wcmVwcm9jZXNzZWQgfD4KICBiaW5kX2NvbHMocHJlZGljdGlvbikgfD4KICBybXNlKGBDTzIgZW1pc3Npb24gKHVnL2gvZylgLCAucHJlZCkKcm1zZQpybXNlIDwtICByb3VuZChhcy5udW1lcmljKHJtc2VbMSwzXSksIDIpCmBgYAoKYGBge3J9CnJzcSA8LSAgZGF0YV9jbzJfcHJlcHJvY2Vzc2VkIHw+CiAgYmluZF9jb2xzKHByZWRpY3Rpb24pIHw+CiAgcnNxKGBDTzIgZW1pc3Npb24gKHVnL2gvZylgLCAucHJlZCkKcnNxCnJzcSA8LSByb3VuZChhcy5udW1lcmljKHJzcVsxLDNdKSwgMikKYGBgCgpgYGB7cn0KZGF0YV9jbzJfcHJlcHJvY2Vzc2VkIHw+CiAgYmluZF9jb2xzKHByZWRpY3Rpb24pIHw+CiAgZ2dwbG90KGFlcyh4ID0gYENPMiBlbWlzc2lvbiAodWcvaC9nKWAsIHkgPSAucHJlZCkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGFiZWwoYWVzKHggPSAtMywgeSA9IC0wLjUpLAogICAgICAgICAgICAgIHZqdXN0ID0gMSwgaGp1c3QgPSAwLAogICAgICAgICAgICAgICBsYWJlbCA9IHBhc3RlKCJSwrIgPSIsICByc3EsICJcblJNU0UgPSIsIHJtc2UpKSArCiAgZ2VvbV9hYmxpbmUoY29sb3IgPSAicmVkIikgKwogIGxhYnMoeD0gYnF1b3RlKCJPYnNlcnZlZCBsb2cifkNPWzJdfiAnZW1pc2lvbiAoJyptdX4nZyd+IGheLTF+Z14tMSonKScpICwgeSA9IGJxdW90ZSgiUHJlZGljdGVkIGxvZyJ+Q09bMl1+ICdlbWlzaW9uICgnKm11fidnJ34gaF4tMX5nXi0xKicpJykpCmBgYAoKIyMjIDcuMyBWYXJpYWJsZSBjb2VmZmljaWVudCBhbmQgY29uZmlkZW5jZSBpbnRlcnZhbHMKCmBgYHtyfQpvcHRpb25zKHJlcHIucGxvdC53aWR0aCA9IDgsIHJlcHIucGxvdC5oZWlnaHQgPSAyKQpoIDwtIGJyb29tOjp0aWR5KG1vZGVsX2ZpdCwgY29uZi5pbnQgPSBUUlVFKSB8PgogIGRwbHlyOjpmaWx0ZXIodGVybSAhPSAiKEludGVyY2VwdCkiKSB8PgogIGdncGxvdChhZXMoZXN0aW1hdGUsIHRlcm0pKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAyKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGNvbmYubG93LCB4bWF4ID0gY29uZi5oaWdoKSwgaGVpZ2h0ID0gMC4xLAogICAgICAgICAgICAgICAgICBzaXplPTAuNSkgKwogIGxhYnMoeCA9ICJDb2VmZmljaWVudCIsIHkgPSAiIikgKwogIHRoZW1lX2xpZ2h0KCkKaCArIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSkKZ2dzYXZlKCJmaWd1cmVzL0xpbmVhci1tb2RlbC1DbzIucG5nIiwgd2lkdGggPSA4LCBoZWlnaHQgPSAyLCBkcGkgPSA2MDApCmBgYAoKIyMjIDcuMyBQcmVkaWN0aW9uIG1vZGVsIG9mIENPMiBlbWlzc2lvbiBpbiBjcmFuYmVycnkgc29pbHMgaW4gdGhyZWUtbGF5ZXIgcG9zaXRpb25zICgwLTEwIGNtLCAxMC0yMCBjbSwgMjAtMzAgY20pIGFuZCBhdCB0aHJlZSB0ZW1wZXJhdHVyZXMgKDEwLCAyMCBhbmQgMzBvQykuCgpgYGB7cn0KTmV3LmxhYnMgPC0gYygiMTDCsEMiLCAiMjDCsEMiLCAiMzDCsEMiKSAjIENoYW5nZSBsYWJlbHMgCm5hbWVzKE5ldy5sYWJzKSA8LSBjKCIxMCIsICIyMCIsICIzMCIpCgpOZXcubGFic19iIDwtICBjKCJbMC0xMCBjbV0iLCAiWzEwLTIwIGNtXSIsICJbMjAtMzAgY21dIikgIyBDaGFuZ2UgbGFiZWxzCm5hbWVzKE5ldy5sYWJzX2IpIDwtIGMoIjEwIiwgIjIwIiwgIjMwIikKCm9wdGlvbnMocmVwci5wbG90LndpZHRoID0gOCwgcmVwci5wbG90LmhlaWdodCA9IDYpCnBsIDwtIGRhdGFfY28yX2NsZWFuIHw+CiAgYmluZF9jb2xzKDEwXnByZWRpY3Rpb24pIHw+CiBnZ3Bsb3QoYWVzKHggPSBgVGltZSAoZGF5cylgLCB5ID0gYENPMiBlbWlzc2lvbiAodWcvaC9nKWApKSArCiAgZ2VvbV9wb2ludChzaXplID0gMS41LCBhbHBoYSA9IDAuNCkgKwogZmFjZXRfZ3JpZChgRGVwdGggKGNtKWAgfiBgVGVtcGVyYXR1cmUgKMKwQylgLCBzY2FsZXMgPSAiZnJlZSIsIGxhYmVsbGVyID0gbGFiZWxsZXIoYERlcHRoIChjbSlgID0gTmV3LmxhYnNfYiwgYFRlbXBlcmF0dXJlICjCsEMpYCA9IE5ldy5sYWJzKSkgKwogIGdlb21fbGluZShhZXMoeCA9IGBUaW1lIChkYXlzKWAsIHkgPSBgLnByZWRgKSkgKwpzY2FsZV95X2xvZzEwKCkgKwp0aGVtZV9idygpICsKICB4bGFiKCJJbmN1YmF0aW9uIHRpbWUgKGRheXMpIikgKyB5bGFiKGJxdW90ZSh+Q09bMl1+ICdlbWlzaW9uIHJhdGUgKCcqbXV+J2cnfiBoXi0xfmdeLTEqJyknKSkKICAKcGwgKyB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksCiAgICAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpKQogIApnZ3NhdmUoImZpZ3VyZXMvQ08yIGVtaXNzaW9uLnBuZyIsIHBsb3Q9IHBsLCB3aWR0aCA9IDksIGhlaWdodCA9IDcsIGRwaSA9IDYwMCkjIGV4cG9ydCBwbG90IGhpZ2ggcmVzb2x1dGlvbgpgYGAKCiMjIDguIFdoYXQgaXMgdGhlIHRlbXBlcmF0dXJlIHNlbnNpdGl2aXR5IGFjcm9zcyBjcmFuYmVycnkgc29pbCBsYXllcnM/CgojIyMgOC4xIEZpdCBvZiBBcnJoZW5pdXMgZXF1YXRpb24KClRoZSBBcnJoZW5pdXMgZXF1YXRpb24gaGFzIGJlZW4gdXNlZCB0byBkZXNjcmliZSB0ZW1wZXJhdHVyZSBzZW5zaXRpdml0eSB0byBDTzIgZW1pc3Npb24uIFRoZSBBcnJoZW5pdXMgZXF1YXRpb24gd2FzIGNvbXB1dGVkIGFzIGZvbGxvd3M6IAoKCgokJGsgPSBBIGVee3tcZnJhY3stRWF9e1JUfX19JCQKCiQkbG9nIFxsZWZ0KCBrIFxyaWdodCkgPSBsb2cgXGxlZnQoIEEgZV57XGZyYWN7LUVhfXtSVH19IFxyaWdodCkkJAoKJCRsb2cgXGxlZnQoIGsgXHJpZ2h0KSA9IGxvZyBcbGVmdCggQSBccmlnaHQpICsgbG9nIFxsZWZ0KGVee1xmcmFjey1FYX17UlR9fSBccmlnaHQpJCQKCiQkbG9nIFxsZWZ0KCBrIFxyaWdodCkgPSBsb2cgXGxlZnQoIEEgXHJpZ2h0KSAtIFxmcmFjezF9e1R9IFx0aW1lcyBcbGVmdChcZnJhY3tFYX17Un1ccmlnaHQpJCQKCldoZXJlICRBJCBpcyB0aGUgcHJlLWV4cG9uZW50aWFsIGZhY3RvciBhbmQgJEVhJCBpcyBhY3RpdmF0aW9uIGVuZXJneSBhc3N1bWVkIHRvIGJlIGluZGVwZW5kZW50IG9mIHRlbXBlcmF0dXJlLCAkUiQgaXMgdGhlIHVuaXZlcnNhbCBnYXMgY29uc3RhbnQgYW5kICRUJCBpcyBhYnNvbHV0ZSB0ZW1wZXJhdHVyZSAoS2VsdmluKQoKCmBgYHtyfQptb2RlbHNfY28yIDwtIGRhdGFfY28yICU+JQogIGdyb3VwX2J5KGBEZXB0aCAoY20pYCkgJT4lCiAgc3VtbWFyaXNlKGxpbm1vZCA9IGxpc3QobG0obG5LIH4gYDEvVGApKSkKbW9kZWxzX2NvMgpgYGAKCmBgYHtyfQpsaW5tb2RfY29lZiA8LSBsaXN0KCkKZm9yIChpIGluIHNlcV9hbG9uZyhtb2RlbHNfY28yJGxpbm1vZCkpIGxpbm1vZF9jb2VmW1tpXV0gPC0gbW9kZWxzX2NvMiRsaW5tb2RbW2ldXSRjb2VmZmljaWVudHMKbGlubW9kX2NvZWYgPC0gZG8uY2FsbChyYmluZC5kYXRhLmZyYW1lLCBsaW5tb2RfY29lZikKbmFtZXMobGlubW9kX2NvZWYpIDwtIGMoIkludGVyY2VwdCIsICJTbG9wZSIpCmxpbm1vZF9jb2VmIDwtIGJpbmRfY29scyh1bmlxdWUoZGF0YV9jbzJbIkRlcHRoIChjbSkiXSksIGxpbm1vZF9jb2VmKQpsaW5tb2RfY29lZgpgYGAKCgpgYGB7cn0Kb3B0aW9ucyhyZXByLnBsb3Qud2lkdGggPSAxMiwgcmVwci5wbG90LmhlaWdodCA9IDYpCiAgcGxvdF9jbzIgPC0gZGF0YV9jbzJfY2xlYW4gJT4lCiAgZ2dwbG90KGFlcyh4ID0gYDEvVGAsIHkgPSBsbkspKSArCiAgZmFjZXRfZ3JpZCh+YERlcHRoIChjbSlgLCBsYWJlbGxlciA9IGxhYmVsbGVyKGBEZXB0aCAoY20pYCA9IE5ldy5sYWJzX2IpKSArCiAgZ2VvbV9ib3hwbG90KGFlcyhncm91cCA9IGZhY3RvcihgMS9UYCkpKSArCnN0YXRfcmVnbGluZV9lcXVhdGlvbihhZXMobGFiZWwgPSAgcGFzdGUoLi5lcS5sYWJlbC4uLCAuLnJyLmxhYmVsLi4sIHNlcCA9ICJ+fiIpKSwgbGFiZWwueCA9IDAuMDAzMzEsIGxhYmVsLnkgPSAtNykgKwogIGdlb21fYWJsaW5lKGRhdGEgPSBsaW5tb2RfY29lZiwgYWVzKGludGVyY2VwdCA9IEludGVyY2VwdCwgc2xvcGUgPSBTbG9wZSksIGx3ZCA9IDEpICsKICBsYWJzKHkgPSAibG4oSykiKSArCnRoZW1lX2J3KCkgKwp0aGVtZShzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLCBheGlzLnRleHQ9ZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpKSAKcGxvdF9jbzIKZ2dzYXZlKCJmaWd1cmVzL0FycmjDqW5pdXMgw6lxdWF0aW9uLnBuZyIsIHBsb3QgPSBwbG90X2NvMiwgd2lkdGggPSA4LCBoZWlnaHQgPSA0LCBkcGkgPSA2MDApIyBleHBvcnQgcGxvdCBoaWdoIHJlc29sdXRpb24KYGBgCgojIyMgOC4yIEFjdGl2YXRpb24gRW5lcmd5IGNvbXB1dGF0aW9uCgpgYGB7cn0KQWN0aXZhdGlvbl9lbmVyZ3kgPC0gdGliYmxlKAogICAgU29pbF9sYXllcnMgPSBjKCIxMCIsICIyMCIsICIzMCIpLAogICAgaW50ZXJjZXB0ID0gTkEsCiAgICBzbG9wZSA9IE5BLAogICAgYWRqX3Jfc3EgPSBOQQopCmBgYAoKYGBge3J9CmxtX2Fycmhlbml1cyA8LSBmb3IgKGkgaW4gMTpucm93KEFjdGl2YXRpb25fZW5lcmd5KSkgewogICAgCiAgICBsbV9BY3RpdmF0aW9uX2VuZXJneSA8LSBkYXRhX2NvMl9jbGVhbiAlPiUKICAgICAgZmlsdGVyKGBEZXB0aCAoY20pYCA9PSBBY3RpdmF0aW9uX2VuZXJneSRTb2lsX2xheWVyc1tpXSkgJT4lCiAgICAgIGxtKGxuSyB+IGAxL1RgLCBkYXRhID0gLikKICAgIAogICAgIyBpbnRlcmNlcHQKICAgIEFjdGl2YXRpb25fZW5lcmd5JGludGVyY2VwdFtpXSA8LSBjb2VmKGxtX0FjdGl2YXRpb25fZW5lcmd5KVsxXQoKICAgICMgU2xvcGUKICAgICBBY3RpdmF0aW9uX2VuZXJneSRzbG9wZVtpXSA8LSBjb2VmKGxtX0FjdGl2YXRpb25fZW5lcmd5KVsyXQogICAKICAgICMgc3RhdGlzdGljcwogICAgQWN0aXZhdGlvbl9lbmVyZ3kkYWRqX3Jfc3FbaV0gPC0gc3VtbWFyeShsbV9BY3RpdmF0aW9uX2VuZXJneSkkYWRqLnIuc3F1YXJlZAp9CmBgYAoKYGBge3J9ClIgPSA4LjMxNDQ2MjEgLyAxMDAwICMgR2FzIGNvbnN0YW50IEtqL21vbC9LIApBY3RpdmF0aW9uX2VuZXJneSA8LSAgQWN0aXZhdGlvbl9lbmVyZ3kgJT4lCiAgbXV0YXRlKEVhID0gLXNsb3BlICogUikgJT4lCiAgc2VsZWN0KFNvaWxfbGF5ZXJzLCBhZGpfcl9zcSwgRWEpCkFjdGl2YXRpb25fZW5lcmd5CmBgYAoKIyMjIDguMyBDb21wdXRpbmcgSyBtZWRpYW4gaW4gb3JkZXIgdG8gY29tcHV0ZSBRMTAgdmFsdWUgYWNjcm9zcyBzb2lsIGRlcHRoCgpgYGB7cn0KS19tZWRpYW4gPC0gYWdncmVnYXRlKEsgfiBgRGVwdGggKGNtKWAgKyBgVGVtcGVyYXR1cmUgKMKwQylgLCBkYXRhID0gZGF0YV9jbzJfY2xlYW4sIEZVTiA9IG1lYW4pCktfbWVkaWFuXzAxIDwtIEtfbWVkaWFuICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBgVGVtcGVyYXR1cmUgKMKwQylgLCB2YWx1ZXNfZnJvbSA9IEspCgpLX21lZGlhbl8wMSRRXzIwXzEwIDwtIEtfbWVkaWFuXzAxJGAyMGAgLyBLX21lZGlhbl8wMSRgMTBgCktfbWVkaWFuXzAxJFFfMzBfMjAgPC0gS19tZWRpYW5fMDEkYDMwYCAvIEtfbWVkaWFuXzAxJGAyMGAKS19tZWRpYW5fMDEKYGBgCgoKYGBge3J9CktfbWVkaWFuXzAyIDwtIGFnZ3JlZ2F0ZShLIH4gYFNpdGVzYCArIGBUaW1lIChkYXlzKWAgKyBgRGVwdGggKGNtKWAgKyBgVGVtcGVyYXR1cmUgKMKwQylgLCBkYXRhID0gZGF0YV9jbzJfY2xlYW4sIEZVTiA9IG1lZGlhbikKCktfbWVkaWFuXzAyIDwtIEtfbWVkaWFuXzAyICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBgVGVtcGVyYXR1cmUgKMKwQylgLCB2YWx1ZXNfZnJvbSA9IEspCgojS19tZWRpYW5fMDIKS19tZWRpYW5fMDIkUV8yMF8xMCA8LSBLX21lZGlhbl8wMiRgMjBgIC8gS19tZWRpYW5fMDIkYDEwYApLX21lZGlhbl8wMiRRXzMwXzIwIDwtIEtfbWVkaWFuXzAyJGAzMGAgLyBLX21lZGlhbl8wMiRgMjBgCktfbWVkaWFuXzAyIDwtIEtfbWVkaWFuXzAyICU+JQpuYS5vbWl0KEtfbWVkaWFuXzAyKQpkYXRhX1ExMCA8LSBnYXRoZXIoZGF0YSA9IEtfbWVkaWFuXzAyLCBrZXkgPSBgVGVtcGVyYXR1cmUgcmFuZ2VgLCB2YWx1ZSA9IFExMCwgYyhgUV8yMF8xMGAsIGBRXzMwXzIwYCksCiAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2tleT1UUlVFKQoKbWVhbl9zZF9RMTAgPC0gZGRwbHkoZGF0YV9RMTAsIH4gYERlcHRoIChjbSlgLAogICAgICAgICAgICAgICAgICBzdW1tYXJpc2UsIFExMF9tZWFuID0gbWVhbihRMTAsIG5hLnJtID0gVFJVRSksIFExMF9zZSA9IHNkKFExMCwgbmEucm0gPSBUUlVFKSAvIHNxcnQoZGltKGRhdGFfUTEwKVsxXSkpCm1lYW5fc2RfUTEwCmBgYAoKYGBge3J9CmRhdGFfUTEwJExvZ19RMTAgPC0gbG9nMTAoZGF0YV9RMTAkUTEwKQoKUTEwX2xtIDwtIGxtKGxvZyhRMTApIH4gYERlcHRoIChjbSlgLAogICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YV9RMTApIApgYGAKCmBgYHtyfQpzdW1tYXJ5KFExMF9sbSkKYGBgCgpgYGB7cn0Kb3B0aW9ucyhyZXByLnBsb3Qud2lkdGggPSA4LCByZXByLnBsb3QuaGVpZ2h0ID0gNCkKZGF0YV9RMTAkYExheWVyc2AgPC0gYXMuY2hhcmFjdGVyKGRhdGFfUTEwJGBEZXB0aCAoY20pYCkKZ2dwbG90KGRhdGE9ZGF0YV9RMTAsIGFlcyh4ID0gYFRpbWUgKGRheXMpYCwgeSA9IGBRMTBgKSkgKwpmYWNldF9ncmlkKC5+YERlcHRoIChjbSlgLCBsYWJlbGxlciA9IGxhYmVsbGVyKGBEZXB0aCAoY20pYCA9IE5ldy5sYWJzX2IpKSArCmdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgY29sb3IgPSAiQmxhY2siKSArCmdlb21fcG9pbnQoc2l6ZSA9IDEuNSwgYWxwaGEgPSAwLjUpICsKdGhlbWVfYncoKSArIAp0aGVtZShzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLCBheGlzLnRleHQ9ZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpKSAKZ2dzYXZlKCJmaWd1cmVzL1ZhcmlhdGlvbiBvZiBRMTAgYWNyb3NzIGxheWVycy5wbmciLCB3aWR0aCA9IDgsIGhlaWdodCA9IDQsIGRwaSA9IDYwMCkjIGV4cG9ydCBwbG90IGhpZ2ggcmVzb2x1dGlvbgpgYGAKCiMjIDkuIFNvaWwgZGVzY3JpcHRpb24KCiMjIyA5LjEgU29pbCBsYXllcnMgcHJvcGVydGllcwoKSW1wb3J0IGRhdGEKCmBgYHtyfQpkYXRhX2NhcmJvbl9jcmVkaXQgPC0gcmVhZF9jc3YyKCdkYXRhL2RhdGFfY2FyYm9uX2NyZWRpdC5jc3YnKQpkYXRhX2NhcmJvbl9jcmVkaXQgPC0gZGF0YV9jYXJib25fY3JlZGl0ICU+JQptdXRhdGUoYEM6TiByYXRpb2AgPSBgQ2FyYm9uZSAoJSlgIC8gYE5pdHJvZ2VuICglKWApCmBgYAoKU29tZSBjYWxjdWxhdGlvbnMKCmBgYHtyfQpuYW1lcyhkYXRhX2NhcmJvbl9jcmVkaXQpCmRhdGFfY2FyYm9uX2NyZWRpdCRgVG90YWwgcG9yb3NpdHlgCmBgYAoKCmBgYHtyfQptZWFuX3NkX0NvdmVyTiA8LSBkZHBseShkYXRhX2NhcmJvbl9jcmVkaXQsIH4gYExheWVyIChjbSlgLAogICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZSwgbWVhbl9Db3Zlck4gPSBtZWFuKGBDOk4gcmF0aW9gLCBuYS5ybSA9IFRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgc2VfQ292ZXJOID0gc2QoYEM6TiByYXRpb2AsIG5hLnJtID0gVFJVRSkvc3FydChsZW5ndGgoIWlzLm5hKGBDOk4gcmF0aW9gKSkpKQptZWFuX3NkX0NvdmVyTgpgYGAKCmBgYHtyfQoKcGxvdF9kZXNjIDwtIGZ1bmN0aW9uKHksIHlsYWIpewogIE5ldy5sYWJzX2MgPC0gIGMoIlNpdGUvQTkiLCAiU2l0ZS80NSIpICMgQ2hhbmdlIGxhYmVscwpuYW1lcyhOZXcubGFic19jKSA8LSBjKCJCZWxhbmdlci8gQTkiLCAiRm9ydGllci8gNDUiKQogIGdncGxvdChkYXRhX2NhcmJvbl9jcmVkaXQsIGFlcyhgTGF5ZXIgKGNtKWAsIHkpKSArCmZhY2V0X2dyaWQoIC4gfiBgTG9jYXRpb25gLCBzY2FsZXMgPSAiZnJlZSIsIGxhYmVsbGVyID0gbGFiZWxsZXIoYExvY2F0aW9uYCA9IE5ldy5sYWJzX2MpKSArCmdlb21fYm94cGxvdCgpICsgCnRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKSwgYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTExKSwKICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTExKSkgKwogICAgbGFicyh5ID0geWxhYikKICB9CgpwbG90MSA8LSBwbG90X2Rlc2MoZGF0YV9jYXJib25fY3JlZGl0JGBDIHN0b2NrIChrZyBtLTMpYCwgIkMgc3RvY2sgKGtnIG0tMykiKQpwbG90MiA8LSBwbG90X2Rlc2MoZGF0YV9jYXJib25fY3JlZGl0JGBDOk4gcmF0aW9gLCAiQzpOIHJhdGlvIikKcGxvdDMgPC0gcGxvdF9kZXNjKGRhdGFfY2FyYm9uX2NyZWRpdCRgQnVsayBkZW5zaXR5IChrZyBtLTMpYCwgIkJ1bGsgZGVuc2l0eSAoa2cgbS0zKSIpCnBsb3Q0IDwtIHBsb3RfZGVzYyhkYXRhX2NhcmJvbl9jcmVkaXQkcEhDYUNsMiwgInBIQ2FDbDIiKQpwbG90NSA8LSBwbG90X2Rlc2MoZGF0YV9jYXJib25fY3JlZGl0JGBUb3RhbCBwb3Jvc2l0eWAsICJUb3RhbCBwb3Jvc2l0eSIpCnBsb3Q2IDwtIHBsb3RfZGVzYyhkYXRhX2NhcmJvbl9jcmVkaXQkYFdhdGVyIGNvbnRlbnQgKCUpYCwgIldhdGVyIGNvbnRlbnQgKCUpIikKCm9wdGlvbnMocmVwci5wbG90LndpZHRoID0gOCwgcmVwci5wbG90LmhlaWdodCA9IDYpCmZpZ3VyZSA8LSBnZ2FycmFuZ2UocGxvdDEsIHBsb3QyLCBwbG90MywgcGxvdDQsIHBsb3Q1LCBwbG90NiwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIpLCBsYWJlbC54ID0gMC4wNSwgbGFiZWwueSA9IDEuMDEsCiAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAzKQpmaWd1cmUKZ2dzYXZlKCJmaWd1cmVzL1NvaWwgZGVzY3JpcHRpb24ucG5nIiwgd2lkdGggPSA4LCBoZWlnaHQgPSA1LCBkcGkgPSA2MDApIyBleHBvcnQgcGxvdCBoaWdoIHJlc29sdXRpb24KYGBgCgojIyA5LjIgQzpOIHJhdGlvIGluIGFsdGVybmF0ZSBzdWJsYXllcnMgb2Ygc2FuZCBhbmQgb3JnYW5pYyBtYXR0ZXIKCkRhdGEgbG9hZGluZwoKYGBge3J9CkNhcmJvbl9jcmVkaXQgPC0gcmVhZF9jc3YyKCdkYXRhL2RhdGFfY2FyYm9uX3N1YmxheWVyLmNzdicpCkNhcmJvbl9jcmVkaXQKYGBgCgpDOk4gcmF0aW8gY29tcHV0YXRpb24KCmBgYHtyfQpDYXJib25fY3JlZGl0IDwtIENhcmJvbl9jcmVkaXQgJT4lCm11dGF0ZShgQy9OYCA9IENfcG91cmMvTl9wb3VyYykKYGBgCgpHZW5lcmF0aW5nIHRoZSBwbG90cwoKYGBge3J9Cm9wdGlvbnMocmVwci5wbG90LndpZHRoPTgsIHJlcHIucGxvdC5oZWlnaHQ9NCkKcGQgPC0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjIpCk5ldy5sYWJzX2QgPC0gIGMoIlNpdGUvQTkiLCAiU2l0ZS80NSIpICMgQ2hhbmdlIGxhYmVscwpuYW1lcyhOZXcubGFic19kKSA8LSBjKCJCZWxhbmdlci9BOSIsICJGb3J0aWVyLzQ1IikKCnAgPC0gZ2dwbG90KGRhdGE9Q2FyYm9uX2NyZWRpdCwgYWVzKHg9IGBEZXBodCAoY20pYCwgeT0gYEMvTmApKSArCmZhY2V0X2dyaWQoLn5TaXRlLCBsYWJlbGxlciA9IGxhYmVsbGVyKGBTaXRlYCA9IE5ldy5sYWJzX2QpKSArCmdlb21fbGluZShsaW5ldHlwZSA9ICJ0d29kYXNoIikgKwpnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGBTb2lsIHRleHR1cmVgLCBmaWxsID0gYFNvaWwgdGV4dHVyZWApLCBzaXplID0gMykgKwpzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPWMoMjEsIDIxKSkrCnNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiMwMDAwMDAiLCAiI0ZGRkZGRiIpKSArCnNjYWxlX3lfY29udGludW91cyhicmVha3MgPSA1KjA6MTAwMCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gZXhwYW5kX3NjYWxlKGFkZCA9IDUpKSArCnNjYWxlX3hfY29udGludW91cyhicmVha3MgPSA1KjA6MTAwMCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gZXhwYW5kX3NjYWxlKGFkZCA9IDUpKSArCnRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksIGF4aXMudGV4dD1lbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksCiAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIikgLCBsZWdlbmQudGl0bGU9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwKICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSkgKwogIGxhYnMoeT0gIkMvTiBSYXRpbyIpIApwICsgY29vcmRfZmxpcCgpCmdnc2F2ZSgiZmlndXJlcy8oQ19vdmVyX04pLnBuZyIsIHdpZHRoID0gOCwgaGVpZ2h0ID0gNCwgZHBpID0gODAwKQpgYGAKCg==